home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Just Call Me Internet
/
Just Call Me Internet.iso
/
prog
/
atari
/
c
/
du_lib
/
xacc2
/
xacctest.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-09-14
|
13KB
|
452 lines
/* XACCTEST.PRG/ACC - ein XACC-Beispiel und Testprogramm
(c) 1993 Harald Sommerfeldt @ KI im Maus-Netz
E-Mail: Harald_Sommerfeldt@ki.maus.de */
/* Geschichte:
22.03.93: erste Version
05.09.93: erste verffentlichte Version
09.09.93: luft nun auch unter Speicherschutz (MiNT)
*/
/*
++craig
PATCHES FOR LATTICE C 5.52 [13/9/94] by Craig Graham.
*/
/* Hinweise:
- dieses Programm luft sowohl als ACC als auch als PRG
- dieses Programm wurde mit Tabweite 3 entwickelt
*/
#include <aes.h>
#include <tos.h>
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include "xacc.h"
#include "xacctest.h"
extern int _XMODE;
typedef enum { FALSE, TRUE } bool;
short ap_id, menu_id; /* AES Application-ID und Menu-ID */
OBJECT *menu; /* Menbaum */
char path[80], name[14]; /* fr fsel_input() */
bool handle_mesag( const short *msgbuf );
/* form_alert() mit Format-String */
short form_falert( short defbut, const char *fastring, ... )
{
va_list argposhort;
static char buffer[256];
short button;
wind_update( BEG_UPDATE );
va_start( argposhort, fastring );
vsprintf( buffer, fastring, argposhort );
va_end( argposhort );
button = form_alert( defbut, buffer );
wind_update( END_UPDATE );
return button;
}
/* vereinfachtes rsrc_gaddr() */
OBJECT *rsrc_gtaddr( short index )
{
OBJECT *tree;
rsrc_gaddr( 0, index, &tree );
return tree;
}
/* dem Benutzer eine Liste der aktiven XACC-Applikationen anbieten;
diese Routine kann nur max. 8 Eshortrge verwalten (in einem richtigen
Programm sollte man natrlich alle anbieten), damit sie kurz und
knapp (und verstndlich) bleibt
info : Infozeile, worum es berhaupt geht
groups : Bitmaske, welche Groups wir brauchen
zurckgegeben wird der Index des XACC-Eshortrages oder NIL (-1) */
#define NXACC 8 /* soviele Eshortrge passen in unsere Liste */
short do_list( const char *info, short groups )
{
OBJECT *dialog;
short obj, i, x, y, w, h;
TEDINFO *t;
dialog = rsrc_gtaddr( XACCLIST );
/* Titel setzen und Unterstreichung anpassen */
(char *)(dialog[XL_TITLE].ob_spec) = (char *)info;
dialog[XL_TITUN].ob_width = dialog[XL_TITLE].ob_width / (short)strlen( "STRING" ) * (short)strlen( info );
/* Eshortrge in die Liste eshortragen */
for ( i = 0; i < NXACC; i++ ) {
if ( xaccs[i].id >= 0 ) {
t=(TEDINFO*)(dialog[XL_ENTRY+i].ob_spec);
sprintf( t->te_ptext, "%-30s %2d %#06x",
xaccs[i].name, xaccs[i].id, xaccs[i].groups );
if ( xaccs[i].groups & groups )
dialog[XL_ENTRY+i].ob_state &= ~DISABLED;
else
dialog[XL_ENTRY+i].ob_state |= DISABLED;
}
else {
t=(TEDINFO*)(dialog[XL_ENTRY+i].ob_spec);
sprintf( t->te_ptext, "%-40s", "" );
dialog[XL_ENTRY+i].ob_state |= DISABLED;
dialog[XL_ENTRY+i].ob_state &= ~SELECTED;
}
}
/* Dialog darstellen */
form_center( dialog, &x, &y, &w, &h );
wind_update( BEG_UPDATE );
form_dial( FMD_START, 0, 0, 0, 0, x, y, w, h );
objc_draw( dialog, 0, MAX_DEPTH, x, y, w, h );
obj = form_do( dialog, 0 );
dialog[obj].ob_state &= ~SELECTED;
if ( obj == XL_OK ) {
for ( i = 0; i < NXACC; i++ ) {
if ( dialog[XL_ENTRY+i].ob_state & SELECTED ) break;
}
if ( i == NXACC ) i = -1;
}
else i = -1;
form_dial( FMD_FINISH, 0, 0, 0, 0, x, y, w, h );
wind_update( END_UPDATE );
/* Index zurckgeben */
return i;
}
/* eine Taste mittels ACC_KEY versenden */
void do_key( short i )
{
OBJECT *dialog = rsrc_gtaddr( SENDKEY );
short msgbuf[8], x, y, w, h;
wind_update( BEG_UPDATE );
form_center( dialog, &x, &y, &w, &h );
form_dial( FMD_START, 0, 0, 0, 0, x, y, w, h );
objc_draw( dialog, 0, MAX_DEPTH, x, y, w, h );
wind_update( BEG_MCTRL );
msgbuf[0] = ACC_KEY;
msgbuf[1] = ap_id;
msgbuf[2] = 0;
msgbuf[3] = evnt_keybd();
appl_write( xaccs[i].id, 16, msgbuf );
wind_update( END_MCTRL );
form_dial( FMD_FINISH, 0, 0, 0, 0, x, y, w, h );
wind_update( END_UPDATE );
}
/* einen Text mittels ACC_TEXT versenden */
void do_text( short i )
{
OBJECT *dialog;
TEDINFO *t;
short msgbuf[8], x, y, w, h, obj;
char *buffer;
dialog = rsrc_gtaddr( SENDTEXT );
wind_update( BEG_UPDATE );
form_center( dialog, &x, &y, &w, &h );
form_dial( FMD_START, 0, 0, 0, 0, x, y, w, h );
objc_draw( dialog, 0, MAX_DEPTH, x, y, w, h );
obj = form_do( dialog, 0 );
dialog[obj].ob_state &= ~SELECTED;
if ( obj == STXT_OK ) {
buffer = xacc_malloc( 100 );
if ( buffer != NULL ) {
t=(TEDINFO*)(dialog[STXT_TXT].ob_spec);
strcpy( buffer, t->te_ptext );
msgbuf[0] = ACC_TEXT;
msgbuf[1] = ap_id;
msgbuf[2] = 0;
*(char **)(msgbuf+4) = buffer;
appl_write( xaccs[i].id, 16, msgbuf );
}
else form_falert( 1, "[3][* Fehler bei xacc_malloc()][ OK ]" );
}
form_dial( FMD_FINISH, 0, 0, 0, 0, x, y, w, h );
wind_update( END_UPDATE );
}
/* ein Stck Datei versenden */
short do_sendpiece( short dest_id, short type, short das_ende, const char *addr, long length )
{
short msgbuf[8], dummy, event, keycode;
if ( xacc_send( dest_id, type, addr, length, das_ende ) ) {
/* auf Besttigung warten, Timeout: 30 Sekunden */
for (;;) {
event = evnt_multi( MU_MESAG|MU_KEYBD|MU_TIMER, 2, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, msgbuf, 30*1000, 0,
&dummy, &dummy, &dummy, &dummy, &keycode, &dummy );
/* UNDO gedrckt: keine Lust mehr */
if ( (event & MU_KEYBD) && keycode == 0x6100 ) { /* UNDO */
if ( form_falert( 1, "[2][ |Senden abbrechen?][Ja|Nein]" ) == 1 )
break;
}
/* eine Nachricht fr uns */
if ( event & MU_MESAG ) {
if ( msgbuf[0] == ACC_ACK ) {
/* alles paletti: weiter im Text */
if ( msgbuf[3] ) return TRUE;
/* ansonsten: das Leben ist hart und ungerecht */
form_falert( 1, "[3][ |Keiner mag mich!][Schnff]" );
break;
}
if ( msgbuf[0] != MN_SELECTED && msgbuf[0] != AC_OPEN )
handle_mesag( msgbuf );
}
/* 30 Sekunden vorbei: Timeout */
if ( event & MU_TIMER ) {
form_falert( 1, "[3][ |Timeout beim Senden][Abbruch]" );
break;
}
}
}
return FALSE;
}
/* eine Datei mittels 'message' versenden */
void do_sendfile( short i, const char *fileext, short message )
{
char fpath[128], *buffer;
short button, fh;
long l;
/* ein wenig Vorbereitung fr fsel_input()... */
if ( *path == '\0' ) {
path[0] = Dgetdrv() + 'A';
path[1] = ':';
Dgetpath( path+2, 0 );
strcat( path+2, "\\" );
}
strcat( strcpy( strrchr( path, '\\' ) + 1, "*." ), fileext );
if ( strchr( name, '.' ) != NULL ) strcpy( strchr( name, '.' ) + 1, fileext );
/* Dateiauswahl aufrufen */
if ( fsel_input( path, name, &button ) && button ) {
/* Bastelstunde: wir basteln und einen Dateinamen */
strcpy( strrchr( strcpy( fpath, path ), '\\' ) + 1, name );
/* Handwerkerstunde: wir ffnen eine Datei */
if ( (l = Fopen( fpath, FO_READ )) >= 0L ) {
fh = (short)l;
/* Programmierstunde: wir versenden eine Datei mittels XACC */
buffer = xacc_malloc( 1000L );
if ( buffer != NULL ) {
for (;;) {
l = Fread( fh, 1000L, buffer );
if ( l <= 0L ) {
do_sendpiece( xaccs[i].id, message, TRUE, buffer, 0L );
break;
}
if ( !do_sendpiece( xaccs[i].id, message, l < 1000L, buffer, l ) )
break;
if ( l < 1000L ) break;
}
Mfree( buffer );
}
else form_falert( 1, "[3][* Fehler bei xacc_malloc()][ OK ]" );
Fclose( fh );
}
}
}
/* eine GEM-Metadatei mittels ACC_META versenden */
void do_meta( short i )
{
do_sendfile( i, "GEM", ACC_META );
}
/* eine GEM-Imagedatei mittels ACC_IMG versenden */
void do_img( short i )
{
do_sendfile( i, "IMG", ACC_IMG );
}
/* das Copyright des genialen & begnadeten Programmieres ausgeben :-) */
void do_info( void )
{
form_falert( 1, "[1][ |xAcc - Testprogramm|(c) 1993 Harald Sommerfeldt][ OK ]" );
}
/* der Hauptdialog, der in der ACC-Version die Menzeile ersetzt */
void do_dialog( void )
{
OBJECT *dialog = rsrc_gtaddr( DIALOG );
short x, y, w, h, obj;
short i;
wind_update( BEG_UPDATE );
form_center( dialog, &x, &y, &w, &h );
form_dial( FMD_START, 0, 0, 0, 0, x, y, w, h );
objc_draw( dialog, 0, MAX_DEPTH, x, y, w, h );
obj = form_do( dialog, 0 );
dialog[obj].ob_state &= ~SELECTED;
form_dial( FMD_FINISH, 0, 0, 0, 0, x, y, w, h );
wind_update( END_UPDATE );
switch ( obj ) {
case DO_INFO:
do_info();
break;
case DO_KEY:
if ( (i = do_list( "sende Taste ...", 1 )) >= 0 ) do_key( i );
break;
case DO_TEXT:
if ( (i = do_list( "sende Text ...", 1 )) >= 0 ) do_text( i );
break;
case DO_META:
if ( (i = do_list( "sende GEM-Metadatei ...", 2 )) >= 0 ) do_meta( i );
break;
case DO_IMG:
if ( (i = do_list( "sende GEM-Imagedatei ...", 2 )) >= 0 ) do_img( i );
break;
}
}
/* GEM-Nachrichten Dispatcher, wird u.a. rekursiv von do_sendpiece() aufgerufen */
bool handle_mesag( const short *msgbuf )
{
short i;
if ( !xacc_message( msgbuf ) ) switch ( msgbuf[0] ) {
case AC_OPEN: /* ACC-Eshortrag angewhlt */
if ( menu != NULL ) do_dialog();
else form_falert( 1, "[3][ |XACCTEST.RSC nicht geladen][Abbruch]" );
break;
case MN_SELECTED: /* Meneshortrag angeklickt */
switch( msgbuf[4] ) {
case MINFO:
do_info();
break;
case MS_KEY:
if ( (i = do_list( "sende Taste...", 1 )) >= 0 ) do_key( i );
break;
case MS_TEXT:
if ( (i = do_list( "sende Text...", 1 )) >= 0 ) do_text( i );
break;
case MS_META:
if ( (i = do_list( "sende GEM-Metadatei...", 2 )) >= 0 ) do_meta( i );
break;
case MS_IMG:
if ( (i = do_list( "sende GEM-Imagedatei...", 2 )) >= 0 ) do_img( i );
break;
case MQUIT:
return FALSE; /* Programmende */
}
menu_tnormal( menu, msgbuf[3], TRUE );
break;
case ACC_ACK:
/* ein Empfnger will uns Kunde tun von seiner Begeisterung auf
die ACC_TEXT, ACC_KEY, ACC_META oder ACC_IMG-Nachricht, die
wir ihm geschickt hatten, msgbuf[3] enthlt den
Begeisterungsgrad: 0 (durchgefallen) oder 1 (bestanden) */
form_falert( 1, ( msgbuf[3] ) ? "[1][ |ACC_ACK TRUE|empfangen][ OK ]"
: "[1][ |ACC_ACK FALSE|empfangen][ OK ]" );
break;
case ACC_TEXT:
/* es wird versucht, uns einen Text anzudrehen */
{ char buffer[22];
strncpy( buffer, *(char **)(msgbuf+4), 20 )[20] = '\0';
if ( form_falert( 1, "[1][ |ACC_TEXT \"%s\"|empfangen][OK|nicht OK]", buffer ) == 1 )
xacc_ack( msgbuf[1], TRUE );
else
xacc_ack( msgbuf[1], FALSE );
}
break;
case ACC_KEY:
/* es wird versucht, uns eine Taste anzudrehen */
if ( form_falert( 1, "[1][ |ACC_KEY %#06x|empfangen][OK|nicht OK]", msgbuf[3] ) == 1 )
xacc_ack( msgbuf[1], TRUE );
else
xacc_ack( msgbuf[1], FALSE );
break;
case ACC_META:
/* es wird versucht, uns eine GEM-Metadatei anzudrehen */
if ( form_falert( 1, "[1][ |ACC_META %d %p %ld|empfangen][OK|nicht OK]",
msgbuf[3], *(char **)(msgbuf+4), *(long *)(msgbuf+6) ) == 1 )
xacc_ack( msgbuf[1], TRUE );
else
xacc_ack( msgbuf[1], FALSE );
break;
case ACC_IMG:
/* es wird versucht, uns eine GEM-Imagedatei anzudrehen */
if ( form_falert( 1, "[1][ |ACC_IMG %d %p %ld|empfangen][OK|nicht OK]",
msgbuf[3], *(char **)(msgbuf+4), *(long *)(msgbuf+6) ) == 1 )
xacc_ack( msgbuf[1], TRUE );
else
xacc_ack( msgbuf[1], FALSE );
break;
}
return TRUE;
}
/* und hier nun die Krnung: das Hauptprogramm */
short main( void )
{
TEDINFO *t;
const char xaccname[] = "XACC-Testprogramm";
short msgbuf[8];
ap_id = appl_init();
if ( _XMODE==2 ) menu_id = menu_register( ap_id, " XACC-Testprogramm" );
else menu_id = -1;
wind_update( BEG_UPDATE );
if ( rsrc_load( "XACCTEST.RSC" ) ) {
menu = rsrc_gtaddr( MENU );
t=(TEDINFO*)((rsrc_gtaddr( SENDTEXT ))[STXT_TXT].ob_spec);
t->te_ptext[0] = '\0';
}
else menu = NULL;
if ( _XMODE==0 ) { /* Ich Programm? Du Menzeile darstellen! */
if ( menu != NULL ) {
menu_bar( menu, TRUE );
graf_mouse( ARROW, NULL );
}
else form_falert( 1, "[3][ |XACCTEST.RSC nicht geladen][Abbruch]" );
}
wind_update( END_UPDATE );
/* XACC-Protokoll anwerfen */
xacc_init( menu_id, xaccname, (short)sizeof(xaccname), 0x0003 );
for (;;) {
evnt_mesag( msgbuf ); /* auf Nachricht warten */
if ( !handle_mesag( msgbuf ) ) break; /* und auswerten */
}
/* XACC-Protokoll abmelden */
xacc_exit();
appl_exit();
return 0;
}